home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / term43-source.lha / Extras / Source / gtlayout-Source.lha / LT_LayoutMenus.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-24  |  3.1 KB  |  150 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1994 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. struct Menu * __stdargs
  10. LT_LayoutMenus(LayoutHandle *handle,struct NewMenu *menuTemplate,...)
  11. {
  12.     struct Menu    *Result;
  13.     va_list      VarArgs;
  14.  
  15.     va_start(VarArgs,menuTemplate);
  16.     Result = LT_LayoutMenusA(handle,menuTemplate,(struct TagItem *)VarArgs);
  17.     va_end(VarArgs);
  18.  
  19.     return(Result);
  20. }
  21.  
  22. struct Menu * LIBENT
  23. LT_LayoutMenusA(REG(a0) LayoutHandle *handle,REG(a1) struct NewMenu *menuTemplate,REG(a2) struct TagItem *TagParams)
  24. {
  25.     struct Menu *menu;
  26.  
  27.     menu = NULL;
  28.  
  29.     if(handle)
  30.     {
  31.         struct TagItem    *tag;
  32.         LONG         label;
  33.         BOOLEAN      foundFirst;
  34.         BOOLEAN      foundLast;
  35.         LONG        *Table = NULL;
  36.  
  37.         foundFirst    = FALSE;
  38.         foundLast    = FALSE;
  39.  
  40.         if(tag = FindTagItem(LA_LabelTable,(struct TagItem *)TagParams))
  41.             Table = (LONG *)tag -> ti_Data;
  42.  
  43.         if(tag = FindTagItem(LA_FirstLabel,(struct TagItem *)TagParams))
  44.         {
  45.             foundFirst = TRUE;
  46.  
  47.             label = tag -> ti_Data;
  48.         }
  49.  
  50.         if(tag = FindTagItem(LA_LastLabel,(struct TagItem *)TagParams))
  51.             foundLast = TRUE;
  52.  
  53.         if(foundFirst == foundLast || Table)
  54.         {
  55.             struct NewMenu *localTemplate;
  56.  
  57.             localTemplate = NULL;
  58.  
  59.             if(Table)
  60.             {
  61.                 foundFirst = FALSE;
  62.  
  63.                 if(handle -> LocaleHook)
  64.                 {
  65.                     LONG count;
  66.  
  67.                     count = 0;
  68.  
  69.                     while(menuTemplate[count] . nm_Type != NM_END)
  70.                         count++;
  71.  
  72.                     count++;
  73.  
  74.                     if(localTemplate = AllocVec(sizeof(struct NewMenu) * count,MEMF_ANY | MEMF_PUBLIC))
  75.                     {
  76.                         LONG i;
  77.  
  78.                         CopyMem(menuTemplate,localTemplate,sizeof(struct NewMenu) * count);
  79.  
  80.                         for(i = 0 ; i < count ; i++)
  81.                         {
  82.                             if(localTemplate[i] . nm_Label != NM_BARLABEL && (localTemplate[i] . nm_Type == NM_TITLE || localTemplate[i] . nm_Type == NM_ITEM || localTemplate[i] . nm_Type == NM_SUB))
  83.                                 localTemplate[i] . nm_Label = (STRPTR)CallHookPkt(handle -> LocaleHook,handle,(APTR)(*Table++));
  84.                         }
  85.                     }
  86.                 }
  87.  
  88.                 menuTemplate = localTemplate;
  89.             }
  90.  
  91.             if(foundFirst)
  92.             {
  93.                 if(handle -> LocaleHook)
  94.                 {
  95.                     LONG count;
  96.  
  97.                     count = 0;
  98.  
  99.                     while(menuTemplate[count] . nm_Type != NM_END)
  100.                         count++;
  101.  
  102.                     count++;
  103.  
  104.                     if(localTemplate = AllocVec(sizeof(struct NewMenu) * count,MEMF_ANY | MEMF_PUBLIC))
  105.                     {
  106.                         LONG i;
  107.  
  108.                         CopyMem(menuTemplate,localTemplate,sizeof(struct NewMenu) * count);
  109.  
  110.                         for(i = 0 ; i < count ; i++)
  111.                         {
  112.                             if(localTemplate[i] . nm_Label != NM_BARLABEL && (localTemplate[i] . nm_Type == NM_TITLE || localTemplate[i] . nm_Type == NM_ITEM || localTemplate[i] . nm_Type == NM_SUB))
  113.                             {
  114.                                 localTemplate[i] . nm_Label = (STRPTR)CallHookPkt(handle -> LocaleHook,handle,(APTR)label);
  115.  
  116.                                 label++;
  117.                             }
  118.                         }
  119.                     }
  120.                 }
  121.  
  122.                 menuTemplate = localTemplate;
  123.             }
  124.  
  125.             if(menuTemplate)
  126.             {
  127.                 if(menu = CreateMenusA(menuTemplate,NULL))
  128.                 {
  129.                     if(!LayoutMenus(menu,handle -> VisualInfo,
  130.                         GTMN_NewLookMenus,    TRUE,
  131.  
  132.                         handle -> AmigaGlyph ? GTMN_AmigaKey :    TAG_IGNORE,handle -> AmigaGlyph,
  133.                         handle -> CheckGlyph ? GTMN_Checkmark : TAG_IGNORE,handle -> CheckGlyph,
  134.                     TAG_DONE))
  135.                     {
  136.                         FreeMenus(menu);
  137.  
  138.                         menu = NULL;
  139.                     }
  140.                 }
  141.  
  142.                 if(localTemplate)
  143.                     FreeVec(localTemplate);
  144.             }
  145.         }
  146.     }
  147.  
  148.     return(menu);
  149. }
  150.